# 给定一个 n 叉树的根节点  root ，返回 其节点值的 前序遍历 。
#
# n 叉树 在输入中按层序遍历进行序列化表示，每组子节点由空值 null 分隔（请参见示例）。
#
#
#
#  例如，给定一个 3叉树 :
# 输入：root = [1,null,3,2,4,null,5,6]
# 输出：[1,3,5,6,2,4]
#  返回其前序遍历: [1,3,5,6,2,4]。
#
#
#
#  说明: 递归法很简单，你可以使用迭代法完成此题吗? Related Topics 树
#  👍 120 👎 0

from typing import List


class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children


class Solution:
    """
        N 叉树的前序遍历迭代实现
    """

    def preorder2(self, root: Node) -> List[int]:
        if not root:
            return []
        res, stack = [], [root]
        while stack:
            node = stack.pop()
            res.append(node.val)
            stack.extend(node.children[::-1])  # 倒序将全部子节点入栈，这样出栈才能保证前面的子节点先出栈
            # 等价于下面的写法
            # stack += node.children[::-1]  # 倒序将全部子节点入栈，这样出栈才能保证前面的子节点先出栈
        return res

    """
    N 叉树的前序遍历递归实现
    """

    def preorder1(self, root: Node) -> List[int]:
        if not root:
            return []
        res = [root.val]
        for child in root.children:
            res += self.preorder(child)
            # 等价于下面的写法
            # res.extend(self.preorder(child))
        return res

    def preorder(self, root: Node) -> List[int]:
        return self.preorder1(root)
